package cn.itcast.ssm.controller;

import cn.itcast.ssm.controller.validation.ValidGroup1;
import cn.itcast.ssm.vo.ItemsCustom;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;

/**
 * Description:
 * Created by 4790K_NSL on 2017/7/5.
 */
@Controller

@RequestMapping("/upload")
public class UploadMapping {
    @RequestMapping(value="/editItemsWithFile")
    public String uploadJsp(){
        return "upload/editItemsWithFile";
    }

    @RequestMapping(value="/uploadFiles")
    public String uploadFilesJsp(){
        return "upload/uploadFiles";
    }

    // 商品信息修改提交
    // 在需要校验的pojo前边添加@Validated，在需要校验的pojo后边添加BindingResult
    // bindingResult接收校验出错信息
    // 注意：@Validated和BindingResult bindingResult是配对出现，并且形参顺序是固定的（一前一后）。
    // value={ValidGroup1.class}指定使用ValidGroup1分组的 校验
    // @ModelAttribute可以指定pojo回显到页面在request中的key
    @RequestMapping("/editItemsSubmit")
    public String editItemsSubmit(
            Model model,
            HttpServletRequest request,
            @ModelAttribute("items") @Validated(value = { ValidGroup1.class }) ItemsCustom itemsCustom,
            BindingResult bindingResult,
            MultipartFile items_pic//接收商品图片,如果接收的是多个文件，可以使用数组
    ) throws Exception {
        // 获取校验错误信息
        // 获取校验错误信息
        if (bindingResult.hasErrors()) {
            // 输出错误信息
            List<ObjectError> allErrors = bindingResult.getAllErrors();
            for (ObjectError objectError : allErrors) {
                // 输出错误信息
                System.out.println(objectError.getDefaultMessage());
            }
            // 将错误信息传到页面
            model.addAttribute("allErrors", allErrors);
            //可以直接使用model将提交pojo回显到页面
            model.addAttribute("items", itemsCustom);
            // 出错重新到商品修改页面
            return "upload/editItemsWithFile";
        }

        // 原始名称
        String originalFilename = items_pic.getOriginalFilename();
        //上传图片
        if(items_pic!=null && originalFilename!=null && originalFilename.length()>0){
            //存储图片的物理路径
            String pic_path = "d:\\java_test\\upload\\";
            //新的图片名称
            String newFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
            //新图片
            File newFile = new File(pic_path+newFileName);
            //将内存中的数据写入磁盘
            items_pic.transferTo(newFile);
            //将新图片名称写到itemsCustom中
            itemsCustom.setPic(newFileName);
        }
        return "success";
    }

    @RequestMapping("/uploadFilesSubmit")
    @ResponseBody
    public String uploadFiles(HttpServletRequest request,HttpServletResponse response) throws IllegalStateException, IOException {

        //创建一个通用的多部分解析器
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
        //判断 request 是否有文件上传,即多部分请求
        if(multipartResolver.isMultipart(request)){
            //转换成多部分request
            MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request;
            //取得request中的所有文件名
            Iterator<String> iter = multiRequest.getFileNames();
            int i=0;
            while(iter.hasNext()){
                i++;
                System.out.println(i + " file :");
                //记录上传过程起始时的时间，用来计算上传时间
                int pre = (int) System.currentTimeMillis();
                //取得上传文件
                MultipartFile file = multiRequest.getFile(iter.next());
                if(file != null){
                    //取得当前上传文件的文件名称
                    String originalFileName = file.getOriginalFilename();
                    //如果名称不为“”,说明该文件存在，否则说明该文件不存在
                    if(originalFileName.trim() !=""){
                        System.out.println(originalFileName);
                        //重命名上传后的文件名
                        String newFileName = UUID.randomUUID() + originalFileName.substring(originalFileName.lastIndexOf("."));
                        System.out.println(newFileName);
                        //定义上传路径
                        String absPath = "d:/Java_Test/upload/" + newFileName;

                        file.transferTo(new File(absPath));
                    }
                }
                //记录上传该文件后的时间
                int finaltime = (int) System.currentTimeMillis();
                //System.out.println(finaltime - pre);
            }

        }
        return "success";
    }
}
